프로그램이 메모리에 올라가 실행 중인 상태
구성요소
프로세스 상태
Ready : CPU 할당 대기Running : CPU에서 명령어 실행 중Waiting / Blocked : I/O등 이벤트 대기Terminated : 실행 종료메모리 구조
레지스터 & PC
스레드(Thread)
프로세스 내 실행 단위동기화
Mutex / Lock : 상호 배제, 하나만 접근 가능
Mutex(Mutual Exclusion)
한 번에 하나의 스레드만 임계 영역에 접근할 수 있도록 하는 배타적 잠금
특징
예시
class SharedResource { private int value = 0; private final Object mutex = new Object(); public void increment() { synchronized(mutex) { // mutex를 이용한 배타적 접근 value++; } } }
Lock
스레드 간 공유 자원 접근 제어 객체
Java에서는 ReentrantLock 같은 구현체 사용
특징
lock() -> 임계 영역 접근 시작unlock() -> 임계 영역 종료예시
class SharedCounter { private int count = 0; private ReentrantLock lock = new ReentrantLock(); public void increment() { lock.lock(); try { count++; } finally { lock.unlock(); } } }
Semaphore : N개까지 동시 접근 허용
특정 자원에 동시에 접근할 수 있는 스레드 수를 제한
특징
Semaphore(n) -> 최대 n개 스레드 동시 접근 가능예시
Semaphore semaphore = new Semaphore(3); // 최대 3개 스레드 허용 semaphore.acquire(); // 접근 허용 전 대기 try { // 임계 영역 } finally { semaphore.release(); // 사용 후 반환 }
Synchronized(java), ReentrantLock
synchronized
Java 키워드, 객체 단위로 임계 영역 보호
특징
synchronized(obj){}) 또는 메서드 단위(synchronized void method()) 사용예시
public synchronized void increment() { count++; }
ReentrantLock
Lock 인터페이스 구현체, 재진입 가능
특징
예시
ReentrantLock lock = new ReentrantLock(true); // 공정성 true lock.lock(); try { // 임계 영역 } finally { lock.unlock(); }
스레드 풀(Thread Pool)
ExecutorService pool = Executors.newFixedThreadPool(5); pool.submit(() -> System.out.println("작업 수행"));
1. 물리(Physical) 계층
2. 데이터 링크(Data Link)계층
3. 네트워크(Network) 계층
4. 전송(Transport) 계층
5. 세션(Session) 계층
6. 표현(Presentation) 계층
7. 응용(Application) 계층
계층 : Application -> (Presentation -> Session ->) Transport(TCP/UDP) -> Network(IP) -> Data Link -> Physical
TCP 특징
1. SYN(Synchronize)
SYN=12. SYN-ACK
SYN=1, ACK=13. ACK
ACK=1HTTP
HTTPS
HTTP + URI를 이용한 자원(Resource) 접근 규칙
JSON 형태 데이터 송수신
HTTP 메서드
예시
@PostMapping("/users") public User create(@RequestBody User user) { ... } @GetMapping("/users/{id}") public User read(@PathVariable int id) { ... }
form의 경우 GET, POST만 지원Ajax, fetch를 사용하는 경우 RESTful 규칙에 따라 사용구조 : Header.Payload.Signature
1. Header
{ "alg": "HS256", "typ": "JWT" }
2. Payload
{ "sub": "user123", "exp": 1700000000 }
3. Signature
동작 방식
로그인 성공 -> 서버 JWT 발급
클라이언트 저장 -> HTTP Header(Authorization: Bearer <token>)로 요청 시 전달
LocalStorage
SessionStorage
Cookie
브라우저 자체에 저장
HttpOnly + Secure 옵션 -> JS에서 접근 불가, HTTPS 통신에서만 전송
서버에 자동 전송 -> CSRF 위험
브라우저에 따라 용량 제한
예시
ResponseCookie cookie = ResponseCookie.from("accessToken", token) .httpOnly(true) .secure(true) .path("/") .maxAge(3600) .build(); response.addHeader("Set-Cookie", cookie.toString()); // Spring에서 쿠키 받을 때 @GetMapping("/data") public String getData(@CookieValue("accessToken") String token) { // HttpOnly 쿠키지만 서버에서는 읽을 수 있음 return "Token received: " + token; }
서버는 서버 DB 세션 없이 JWT 서명 검증만으로 사용자 인증
유효기간 만료 -> 토큰 사용 불가 -> 다시 로그인 필요